home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 60 / 60.xpi / chrome / webdeveloper.jar / content / webdeveloper / webdeveloper.js < prev    next >
Text File  |  2009-06-30  |  87KB  |  2,051 lines

  1. var webdeveloper_appliedStyles          = new Array();
  2. var webdeveloper_javaScriptCurrentTime  = null;
  3. var webdeveloper_javaScriptPreviousTime = null;
  4. var webdeveloper_outlineElement         = null;
  5. var webdeveloper_outlinedElements       = new Array();
  6. var webdeveloper_selectedTab            = -1;
  7.  
  8. window.addEventListener("load", webdeveloper_initialize, false);
  9. window.addEventListener("unload", webdeveloper_uninitialize, false);
  10.  
  11. // Displays the about dialog
  12. function webdeveloper_about()
  13. {
  14.     window.openDialog("chrome://webdeveloper/content/about/about.xul", "webdeveloper-about-dialog", "centerscreen,chrome,modal");
  15. }
  16.  
  17. // Add applied style
  18. function webdeveloper_addAppliedStyle(id)
  19. {
  20.     // If the id is not in the applied styles
  21.     if(!webdeveloper_contains(webdeveloper_appliedStyles, id))
  22.     {
  23.         webdeveloper_appliedStyles.push(id);
  24.         webdeveloper_configureElement(document.getElementById("webdeveloper-statusbar-panel"), "hidden", false);
  25.     }
  26. }
  27.  
  28. // Add applied style if the element exists
  29. function webdeveloper_addAppliedStyleByElement(id)
  30. {
  31.     var currentDocument = webdeveloper_getContentDocument();
  32.  
  33.     // If the element exists
  34.     if(currentDocument.getElementById(id))
  35.     {
  36.         webdeveloper_addAppliedStyle(id);
  37.     }
  38. }
  39.  
  40. // Outlines the element in the event
  41. function webdeveloper_addElementOutline(event, currentElement)
  42. {
  43.     var element = event.target;
  44.  
  45.     // If the element is set, is not the same as the current outline element and has a style property
  46.     if(element && element != currentElement && element.style)
  47.     {
  48.         webdeveloper_removeElementOutline(currentElement);
  49.  
  50.         element.style.MozOutline = "1px solid #ff0000";
  51.  
  52.         return element;
  53.     }
  54.  
  55.     return null;
  56. }
  57.  
  58. // Adds the generated styles to a page
  59. function webdeveloper_addGeneratedStyles(generatedDocument)
  60. {
  61.     var headElement  = webdeveloper_getDocumentHeadElement(generatedDocument);
  62.     var linkElement  = generatedDocument.createElement("link");
  63.     var styleElement = generatedDocument.createElement("style");
  64.  
  65.     linkElement.setAttribute("href", "chrome://webdeveloper/content/stylesheets/generated/generated_content.css");
  66.     linkElement.setAttribute("id", "webdeveloper-generated-content-stylesheet");
  67.     linkElement.setAttribute("rel", "stylesheet");
  68.     linkElement.setAttribute("type", "text/css");
  69.     headElement.appendChild(linkElement);
  70.  
  71.     styleElement.setAttribute("type", "text/css");
  72.     styleElement.appendChild(generatedDocument.createTextNode("body, td, th { font-size: " + webdeveloper_getIntegerPreference("webdeveloper.generated.content.font.size", true) + "px !important; }"));
  73.     headElement.appendChild(styleElement);
  74.     
  75.     generatedDocument.documentElement.setAttribute("id", "webdeveloper-generated-content");
  76. }
  77.  
  78. // Adds the generated tools to a page
  79. function webdeveloper_addGeneratedTools(generatedDocument)
  80. {
  81.     var linkElement     = generatedDocument.createElement("a");
  82.     var listElement     = generatedDocument.createElement("ul");
  83.     var listItemElement = generatedDocument.createElement("li");
  84.     var stringBundle    = document.getElementById("webdeveloper-string-bundle");
  85.  
  86.     linkElement.setAttribute("href", "#");
  87.     linkElement.setAttribute("id", "webdeveloper-generated-tool-collapse-all");
  88.     linkElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_collapseAll")));
  89.     listItemElement.appendChild(linkElement);
  90.     listElement.appendChild(listItemElement);
  91.  
  92.     linkElement     = generatedDocument.createElement("a");
  93.     listItemElement = generatedDocument.createElement("li");
  94.  
  95.     linkElement.setAttribute("href", "#");
  96.     linkElement.setAttribute("id", "webdeveloper-generated-tool-expand-all");
  97.     linkElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_expandAll")));
  98.     listItemElement.appendChild(linkElement);
  99.     listElement.appendChild(listItemElement);
  100.  
  101.     listElement.setAttribute("id", "tools");
  102.     webdeveloper_getDocumentBodyElement(generatedDocument).appendChild(listElement);
  103. }
  104.  
  105. // Adds a status menu item
  106. function webdeveloper_addStatusMenuItem(statusMenu, menuId)
  107. {
  108.     var originalMenuItem = document.getElementById(menuId + "-menu");
  109.     var statusMenuItem   = document.createElement("menuitem");
  110.  
  111.     statusMenuItem.setAttribute("checked", true);
  112.     statusMenuItem.setAttribute("class", "webdeveloper-generated-menu");
  113.     statusMenuItem.setAttribute("label", originalMenuItem.getAttribute("label"));
  114.     statusMenuItem.setAttribute("oncommand", originalMenuItem.getAttribute("oncommand"));
  115.     statusMenuItem.setAttribute("type", "checkbox");
  116.  
  117.     statusMenu.insertBefore(statusMenuItem, document.getElementById("webdeveloper-separator-statusbar"));
  118. }
  119.  
  120. // Adds the style sheet at the given location with the given id
  121. function webdeveloper_addStyleSheet(location, id)
  122. {
  123.     var documentList   = webdeveloper_getDocuments(webdeveloper_getContentWindow());
  124.     var documentLength = documentList.length;
  125.     var linkElement    = null;
  126.     var pageDocument   = null;
  127.  
  128.     // Loop through the documents
  129.     for(var i = 0; i < documentLength; i++)
  130.     {
  131.         pageDocument = documentList[i];
  132.         linkElement  = pageDocument.createElement("link");
  133.  
  134.         linkElement.setAttribute("href", location);
  135.         linkElement.setAttribute("id", id);
  136.         linkElement.setAttribute("rel", "stylesheet");
  137.         linkElement.setAttribute("type", "text/css");
  138.  
  139.         webdeveloper_getDocumentHeadElement(pageDocument).appendChild(linkElement);
  140.     }
  141.  
  142.     webdeveloper_addAppliedStyle(id);
  143. }
  144.  
  145. // Adjusts the position of the given element
  146. function webdeveloper_adjustElementPosition(element, xPosition, yPosition, offset)
  147. {
  148.     // If the element is set
  149.     if(element)
  150.     {
  151.         var clientHeight  = element.clientHeight;
  152.         var clientWidth   = element.clientWidth;
  153.         var contentWindow = webdeveloper_getContentWindow();
  154.         var innerHeight   = contentWindow.innerHeight;
  155.         var innerWidth    = contentWindow.innerWidth;
  156.         var offsetX       = contentWindow.pageXOffset;
  157.         var offsetY       = contentWindow.pageYOffset;
  158.  
  159.         // If the x position is less than 0
  160.         if(xPosition < 0)
  161.         {
  162.             xPosition = 0;
  163.         }
  164.  
  165.         // If the y position is less than 0
  166.         if(yPosition < 0)
  167.         {
  168.             yPosition = 0;
  169.         }
  170.  
  171.         // If the element will fit at the x position
  172.         if((xPosition + clientWidth + offset + 5) < (innerWidth + offsetX))
  173.         {
  174.             element.style.left = xPosition + offset + "px";
  175.         }
  176.         else
  177.         {
  178.             element.style.left = (innerWidth + offsetX - clientWidth - offset) + "px";
  179.         }
  180.  
  181.         // If the element will fit at the y position
  182.         if((yPosition + clientHeight + offset + 5) < (innerHeight + offsetY))
  183.         {
  184.             element.style.top = yPosition + offset + "px";
  185.         }
  186.         else
  187.         {
  188.             element.style.top = (innerHeight + offsetY - clientHeight - offset) + "px";
  189.         }
  190.     }
  191. }
  192.  
  193. // Applies all selected style sheets
  194. function webdeveloper_applyStyleSheets(reset)
  195. {
  196.     var appliedStyle        = null;
  197.     var appliedStyles       = webdeveloper_appliedStyles.slice(0);
  198.     var appliedStylesLength = appliedStyles.length;
  199.     var element             = null;
  200.  
  201.     // Loop through the duplicated applied styles
  202.     for(var i = 0; i < appliedStylesLength; i++)
  203.     {
  204.         appliedStyle = appliedStyles[i];
  205.  
  206.         // Switch on the style
  207.         switch(appliedStyle)
  208.         {
  209.             case "webdeveloper-add-user-style-sheet":
  210.                 element = document.getElementById("webdeveloper-add-user-style-sheet-menu");
  211.                 webdeveloper_configureElement(element, "checked", !reset);
  212.                 webdeveloper_addUserStyleSheet(element);
  213.                 break;
  214.             case "webdeveloper-disable-all-styles":
  215.                 element = document.getElementById("webdeveloper-disable-all-styles-menu");
  216.                 webdeveloper_configureElement(element, "checked", !reset);
  217.                 webdeveloper_toggleStyles(element);
  218.                 break;
  219.             case "webdeveloper-disable-browser-default-styles":
  220.                 element = document.getElementById("webdeveloper-disable-browser-default-styles-menu");
  221.                 webdeveloper_configureElement(element, "checked", !reset);
  222.                 webdeveloper_toggleBrowserDefaultStyles(element);
  223.                 break;
  224.             case "webdeveloper-disable-embedded-styles":
  225.                 element = document.getElementById("webdeveloper-disable-embedded-styles-menu");
  226.                 webdeveloper_configureElement(element, "checked", !reset);
  227.                 webdeveloper_toggleEmbeddedStyles(element);
  228.                 break;
  229.             case "webdeveloper-disable-inline-styles":
  230.                 element = document.getElementById("webdeveloper-disable-inline-styles-menu");
  231.                 webdeveloper_configureElement(element, "checked", !reset);
  232.                 webdeveloper_toggleInlineStyles(element);
  233.                 break;
  234.             case "webdeveloper-disable-linked-styles":
  235.                 element = document.getElementById("webdeveloper-disable-linked-styles-menu");
  236.                 webdeveloper_configureElement(element, "checked", !reset);
  237.                 webdeveloper_toggleLinkedStyles(element);
  238.                 break;
  239.             case "webdeveloper-disable-print-styles":
  240.                 element = document.getElementById("webdeveloper-disable-print-styles-menu");
  241.                 webdeveloper_configureElement(element, "checked", !reset);
  242.                 webdeveloper_togglePrintStyles(element);
  243.                 break;
  244.             case "webdeveloper-display-abbreviations":
  245.                 element = document.getElementById("webdeveloper-display-abbreviations-menu");
  246.                 webdeveloper_configureElement(element, "checked", !reset);
  247.                 webdeveloper_displayAbbreviations(element);
  248.                 break;
  249.             case "webdeveloper-display-access-keys":
  250.                 element = document.getElementById("webdeveloper-display-access-keys-menu");
  251.                 webdeveloper_configureElement(element, "checked", !reset);
  252.                 webdeveloper_displayAccessKeys(element);
  253.                 break;
  254.             case "webdeveloper-display-alt-attributes":
  255.                 element = document.getElementById("webdeveloper-display-alt-attributes-menu");
  256.                 webdeveloper_configureElement(element, "checked", !reset);
  257.                 webdeveloper_displayAltAttributes(element);
  258.                 break;
  259.             case "webdeveloper-display-anchors":
  260.                 element = document.getElementById("webdeveloper-display-anchors-menu");
  261.                 webdeveloper_configureElement(element, "checked", !reset);
  262.                 webdeveloper_displayAnchors(element);
  263.                 break;
  264.             case "webdeveloper-display-block-size":
  265.                 element = document.getElementById("webdeveloper-display-block-size-menu");
  266.                 webdeveloper_configureElement(element, "checked", !reset);
  267.                 webdeveloper_displayBlockSize(element);
  268.                 break;
  269.             case "webdeveloper-display-div-order":
  270.                 element = document.getElementById("webdeveloper-display-div-order-menu");
  271.                 webdeveloper_configureElement(element, "checked", !reset);
  272.                 webdeveloper_displayDivOrder(element);
  273.                 break;
  274.             case "webdeveloper-display-element-information":
  275.                 element = document.getElementById("webdeveloper-display-element-information-menu");
  276.                 webdeveloper_configureElement(element, "checked", !reset);
  277.                 webdeveloper_displayElementInformation(element);
  278.                 break;
  279.             case "webdeveloper-display-current-size-title":
  280.                 element = document.getElementById("webdeveloper-display-current-size-title-menu");
  281.                 webdeveloper_configureElement(element, "checked", !reset);
  282.                 webdeveloper_displayWindowSizeInTitle(element);
  283.                 break;
  284.             case "webdeveloper-display-form-details":
  285.                 element = document.getElementById("webdeveloper-display-form-details-menu");
  286.                 webdeveloper_configureElement(element, "checked", !reset);
  287.                 webdeveloper_displayFormDetails(element);
  288.                 break;
  289.             case "webdeveloper-display-handheld-css":
  290.                 element = document.getElementById("webdeveloper-display-handheld-css-menu");
  291.                 webdeveloper_configureElement(element, "checked", !reset);
  292.                 webdeveloper_displayHandheldCSS(element);
  293.                 break;
  294.             case "webdeveloper-display-id-class-details":
  295.                 element = document.getElementById("webdeveloper-display-id-class-details-menu");
  296.                 webdeveloper_configureElement(element, "checked", !reset);
  297.                 webdeveloper_displayIdClassDetails(element);
  298.                 break;
  299.             case "webdeveloper-display-image-dimensions":
  300.                 element = document.getElementById("webdeveloper-display-image-dimensions-menu");
  301.                 webdeveloper_configureElement(element, "checked", !reset);
  302.                 webdeveloper_displayImageDimensions(element);
  303.                 break;
  304.             case "webdeveloper-display-image-file-sizes":
  305.                 element = document.getElementById("webdeveloper-display-image-file-sizes-menu");
  306.                 webdeveloper_configureElement(element, "checked", !reset);
  307.                 webdeveloper_displayImageFileSizes(element);
  308.                 break;
  309.             case "webdeveloper-display-image-paths":
  310.                 element = document.getElementById("webdeveloper-display-image-paths-menu");
  311.                 webdeveloper_configureElement(element, "checked", !reset);
  312.                 webdeveloper_displayImagePaths(element);
  313.                 break;
  314.             case "webdeveloper-display-line-guides":
  315.                 element = document.getElementById("webdeveloper-display-line-guides-menu");
  316.                 webdeveloper_configureElement(element, "checked", !reset);
  317.                 webdeveloper_displayLineGuides(element);
  318.                 break;
  319.             case "webdeveloper-display-link-details":
  320.                 element = document.getElementById("webdeveloper-display-link-details-menu");
  321.                 webdeveloper_configureElement(element, "checked", !reset);
  322.                 webdeveloper_displayLinkDetails(element);
  323.                 break;
  324.             case "webdeveloper-display-object-information":
  325.                 element = document.getElementById("webdeveloper-display-object-information-menu");
  326.                 webdeveloper_configureElement(element, "checked", !reset);
  327.                 webdeveloper_displayObjectInformation(element);
  328.                 break;
  329.             case "webdeveloper-display-print-css":
  330.                 element = document.getElementById("webdeveloper-display-print-css-menu");
  331.                 webdeveloper_configureElement(element, "checked", !reset);
  332.                 webdeveloper_displayPrintCSS(element);
  333.                 break;
  334.             case "webdeveloper-display-ruler":
  335.                 element = document.getElementById("webdeveloper-display-ruler-menu");
  336.                 webdeveloper_configureElement(element, "checked", !reset);
  337.                 webdeveloper_displayRuler(element);
  338.                 break;
  339.             case "webdeveloper-display-stack-levels":
  340.                 element = document.getElementById("webdeveloper-display-stack-levels-menu");
  341.                 webdeveloper_configureElement(element, "checked", !reset);
  342.                 webdeveloper_displayStackLevels(element);
  343.                 break;
  344.             case "webdeveloper-display-tab-index":
  345.                 element = document.getElementById("webdeveloper-display-tab-index-menu");
  346.                 webdeveloper_configureElement(element, "checked", !reset);
  347.                 webdeveloper_displayTabIndex(element);
  348.                 break;
  349.             case "webdeveloper-display-table-depth":
  350.                 element = document.getElementById("webdeveloper-display-table-depth-menu");
  351.                 webdeveloper_configureElement(element, "checked", !reset);
  352.                 webdeveloper_displayTableDepth(element);
  353.                 break;
  354.             case "webdeveloper-display-table-information":
  355.                 element = document.getElementById("webdeveloper-display-table-information-menu");
  356.                 webdeveloper_configureElement(element, "checked", !reset);
  357.                 webdeveloper_displayTableInformation(element);
  358.                 break;
  359.             case "webdeveloper-display-title-attributes":
  360.                 element = document.getElementById("webdeveloper-display-title-attributes-menu");
  361.                 webdeveloper_configureElement(element, "checked", !reset);
  362.                 webdeveloper_displayTitleAttributes(element);
  363.                 break;
  364.             case "webdeveloper-display-topographic-information":
  365.                 element = document.getElementById("webdeveloper-display-topographic-information-menu");
  366.                 webdeveloper_configureElement(element, "checked", !reset);
  367.                 webdeveloper_displayTopographicInformation(element);
  368.                 break;
  369.             case "webdeveloper-display-window-size-title":
  370.                 element = document.getElementById("webdeveloper-display-window-size-title-menu");
  371.                 webdeveloper_configureElement(element, "checked", !reset);
  372.                 webdeveloper_displayWindowSizeInTitle(element);
  373.                 break;
  374.             case "webdeveloper-hide-background-images":
  375.                 element = document.getElementById("webdeveloper-hide-background-images-menu");
  376.                 webdeveloper_configureElement(element, "checked", !reset);
  377.                 webdeveloper_hideBackgroundImages(element);
  378.                 break;
  379.             case "webdeveloper-hide-images":
  380.                 element = document.getElementById("webdeveloper-hide-images-menu");
  381.                 webdeveloper_configureElement(element, "checked", !reset);
  382.                 webdeveloper_hideImages(element, "webdeveloper-hide-images");
  383.                 break;
  384.             case "webdeveloper-linearize-page":
  385.                 element = document.getElementById("webdeveloper-linearize-page-menu");
  386.                 webdeveloper_configureElement(element, "checked", !reset);
  387.                 webdeveloper_linearizePage(element);
  388.                 break;
  389.             case "webdeveloper-make-images-invisible":
  390.                 element = document.getElementById("webdeveloper-make-images-invisible-menu");
  391.                 webdeveloper_configureElement(element, "checked", !reset);
  392.                 webdeveloper_makeImagesInvisible(element, "webdeveloper-make-images-invisible");
  393.                 break;
  394.             case "webdeveloper-outline-absolute-positioned-elements":
  395.                 element = document.getElementById("webdeveloper-outline-absolute-positioned-elements-menu");
  396.                 webdeveloper_configureElement(element, "checked", !reset);
  397.                 webdeveloper_outlinePositionedElements("absolute", element);
  398.                 break;
  399.             case "webdeveloper-outline-all-images":
  400.                 element = document.getElementById("webdeveloper-outline-all-images-menu");
  401.                 webdeveloper_configureElement(element, "checked", !reset);
  402.                 webdeveloper_outlineAllImages(element);
  403.                 break;
  404.             case "webdeveloper-outline-all-tables":
  405.                 element = document.getElementById("webdeveloper-outline-all-tables-menu");
  406.                 webdeveloper_configureElement(element, "checked", !reset);
  407.                 webdeveloper_outlineTables(element);
  408.                 break;
  409.             case "webdeveloper-outline-background-images":
  410.                 element = document.getElementById("webdeveloper-outline-background-images-menu");
  411.                 webdeveloper_configureElement(element, "checked", !reset);
  412.                 webdeveloper_outlineBackgroundImages(element, true);
  413.                 break;
  414.             case "webdeveloper-outline-block-level-elements":
  415.                 element = document.getElementById("webdeveloper-outline-block-level-elements-menu");
  416.                 webdeveloper_configureElement(element, "checked", !reset);
  417.                 webdeveloper_outlineBlockLevelElements(element);
  418.                 break;
  419.             case "webdeveloper-outline-current-element":
  420.                 element = document.getElementById("webdeveloper-outline-current-element-menu");
  421.                 webdeveloper_configureElement(element, "checked", !reset);
  422.                 webdeveloper_outlineCurrentElement(element);
  423.                 break;
  424.             case "webdeveloper-outline-custom-elements":
  425.                 element = document.getElementById("webdeveloper-outline-custom-elements-menu");
  426.                 webdeveloper_configureElement(element, "checked", !reset);
  427.                 webdeveloper_outlineElements(element);
  428.                 break;
  429.             case "webdeveloper-outline-deprecated-elements":
  430.                 element = document.getElementById("webdeveloper-outline-deprecated-elements-menu");
  431.                 webdeveloper_configureElement(element, "checked", !reset);
  432.                 webdeveloper_outlineDeprecatedElements(element);
  433.                 break;
  434.             case "webdeveloper-outline-external-links":
  435.                 element = document.getElementById("webdeveloper-outline-external-links-menu");
  436.                 webdeveloper_configureElement(element, "checked", !reset);
  437.                 webdeveloper_outlineExternalLinks(element);
  438.                 break;
  439.             case "webdeveloper-outline-fixed-positioned-elements":
  440.                 element = document.getElementById("webdeveloper-outline-fixed-positioned-elements-menu");
  441.                 webdeveloper_configureElement(element, "checked", !reset);
  442.                 webdeveloper_outlinePositionedElements("fixed", element);
  443.                 break;
  444.             case "webdeveloper-outline-floated-elements":
  445.                 element = document.getElementById("webdeveloper-outline-floated-elements-menu");
  446.                 webdeveloper_configureElement(element, "checked", !reset);
  447.                 webdeveloper_outlineFloatedElements(element);
  448.                 break;
  449.             case "webdeveloper-outline-frames":
  450.                 element = document.getElementById("webdeveloper-outline-frames-menu");
  451.                 webdeveloper_configureElement(element, "checked", !reset);
  452.                 webdeveloper_outlineFrames(element);
  453.                 break;
  454.             case "webdeveloper-outline-headings":
  455.                 element = document.getElementById("webdeveloper-outline-headings-menu");
  456.                 webdeveloper_configureElement(element, "checked", !reset);
  457.                 webdeveloper_outlineHeadings(element);
  458.                 break;
  459.             case "webdeveloper-outline-images-with-adjusted-dimensions":
  460.                 element = document.getElementById("webdeveloper-outline-images-with-adjusted-dimensions-menu");
  461.                 webdeveloper_configureElement(element, "checked", !reset);
  462.                 webdeveloper_outlineImagesWithAdjustedDimensions(element);
  463.                 break;
  464.             case "webdeveloper-outline-images-with-empty-alt-attributes":
  465.                 element = document.getElementById("webdeveloper-outline-images-with-empty-alt-attributes-menu");
  466.                 webdeveloper_configureElement(element, "checked", !reset);
  467.                 webdeveloper_outlineImagesWithEmptyAltAttributes(element);
  468.                 break;
  469.             case "webdeveloper-outline-images-with-oversized-dimensions":
  470.                 element = document.getElementById("webdeveloper-outline-images-with-oversized-dimensions-menu");
  471.                 webdeveloper_configureElement(element, "checked", !reset);
  472.                 webdeveloper_outlineImagesWithOversizedDimensions(element);
  473.                 break;
  474.             case "webdeveloper-outline-images-without-alt-attributes":
  475.                 element = document.getElementById("webdeveloper-outline-images-without-alt-attributes-menu");
  476.                 webdeveloper_configureElement(element, "checked", !reset);
  477.                 webdeveloper_outlineImagesWithoutAltAttributes(element);
  478.                 break;
  479.             case "webdeveloper-outline-images-without-dimensions":
  480.                 element = document.getElementById("webdeveloper-outline-images-without-dimensions-menu");
  481.                 webdeveloper_configureElement(element, "checked", !reset);
  482.                 webdeveloper_outlineImagesWithoutDimensions(element);
  483.                 break;
  484.             case "webdeveloper-outline-images-without-title-attributes":
  485.                 element = document.getElementById("webdeveloper-outline-images-without-title-attributes-menu");
  486.                 webdeveloper_configureElement(element, "checked", !reset);
  487.                 webdeveloper_outlineImagesWithoutTitleAttributes(element);
  488.                 break;
  489.             case "webdeveloper-outline-links-with-ping-attributes":
  490.                 element = document.getElementById("webdeveloper-outline-links-with-ping-attributes-menu");
  491.                 webdeveloper_configureElement(element, "checked", !reset);
  492.                 webdeveloper_outlineLinksWithPingAttributes(element);
  493.                 break;
  494.             case "webdeveloper-outline-links-without-title-attributes":
  495.                 element = document.getElementById("webdeveloper-outline-links-without-title-attributes-menu");
  496.                 webdeveloper_configureElement(element, "checked", !reset);
  497.                 webdeveloper_outlineLinksWithoutTitleAttributes(element);
  498.                 break;
  499.             case "webdeveloper-outline-relative-positioned-elements":
  500.                 element = document.getElementById("webdeveloper-outline-relative-positioned-elements-menu");
  501.                 webdeveloper_configureElement(element, "checked", !reset);
  502.                 webdeveloper_outlinePositionedElements("relative", element);
  503.                 break;
  504.             case "webdeveloper-outline-table-cells":
  505.                 element = document.getElementById("webdeveloper-outline-table-cells-menu");
  506.                 webdeveloper_configureElement(element, "checked", !reset);
  507.                 webdeveloper_outlineTableCells(element);
  508.                 break;
  509.             case "webdeveloper-replace-images-with-alt-attributes":
  510.                 element = document.getElementById("webdeveloper-replace-images-with-alt-attributes-menu");
  511.                 webdeveloper_configureElement(element, "checked", !reset);
  512.                 webdeveloper_replaceImagesWithAltAttributes(element);
  513.                 break;
  514.             case "webdeveloper-show-comments":
  515.                 element = document.getElementById("webdeveloper-show-comments-menu");
  516.                 webdeveloper_configureElement(element, "checked", !reset);
  517.                 webdeveloper_toggleComments(element);
  518.                 break;
  519.             case "webdeveloper-small-screen-rendering":
  520.                 element = document.getElementById("webdeveloper-small-screen-rendering-menu");
  521.                 webdeveloper_configureElement(element, "checked", !reset);
  522.                 webdeveloper_smallScreenRendering(element);
  523.                 break;
  524.             case "webdeveloper-use-border-box-model":
  525.                 element = document.getElementById("webdeveloper-use-border-box-model-menu");
  526.                 webdeveloper_configureElement(element, "checked", !reset);
  527.                 webdeveloper_toggleBorderBoxModel(element);
  528.                 break;
  529.             case "webdeveloper-view-style-information":
  530.                 element = document.getElementById("webdeveloper-view-style-information-menu");
  531.                 webdeveloper_configureElement(element, "checked", !reset);
  532.                 webdeveloper_viewStyleInformation(element);
  533.                 break;
  534.         }
  535.     }
  536. }
  537.  
  538. // Changes the options
  539. function webdeveloper_changeOptions()
  540. {
  541.     var element                   = null;
  542.     var hideContextMenuPreference = webdeveloper_getBooleanPreference("webdeveloper.context.hide", true);
  543.     var hideMenuPreference        = webdeveloper_getBooleanPreference("webdeveloper.menu.hide", true);
  544.     var toolbar                   = document.getElementById("webdeveloper-toolbar");
  545.  
  546.     // If the toolbar exists
  547.     if(toolbar)
  548.     {
  549.         var toolbarVisible = window.toolbar.visible;
  550.  
  551.         // If the toolbar is visible
  552.         if(toolbarVisible)
  553.         {
  554.             var toolbarButtons       = toolbar.getElementsByTagName("toolbarbutton");
  555.             var toolbarButtonsLength = toolbarButtons.length;
  556.             var toolbarPreference    = webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true);
  557.  
  558.             toolbar.setAttribute("mode", toolbarPreference);
  559.  
  560.             // If the toolbar preference is set to icons
  561.             if(toolbarPreference == "icons")
  562.             {
  563.                 toolbarPreference = "pictures";
  564.             }
  565.  
  566.             toolbar.setAttribute("buttonstyle", toolbarPreference);
  567.  
  568.             // Loop through the toolbar buttons
  569.             for(var i = 0; i < toolbarButtonsLength; i++)
  570.             {
  571.                 toolbarButtons[i].setAttribute("buttonstyle", toolbarPreference);
  572.             }
  573.  
  574.             // If the toolbar preference is not set to text
  575.             if(toolbarPreference != "text")
  576.             {
  577.                 element = document.getElementById("webdeveloper-javascript-statusbar");
  578.  
  579.                 // If the element exists
  580.                 if(element)
  581.                 {
  582.                     element.removeAttribute("label");
  583.                 }
  584.  
  585.                 element = document.getElementById("webdeveloper-render-mode-statusbar");
  586.  
  587.                 // If the element exists
  588.                 if(element)
  589.                 {
  590.                     element.removeAttribute("label");
  591.                 }
  592.             }
  593.         }
  594.     }
  595.  
  596.     element = document.getElementById("webdeveloper-menu");
  597.  
  598.     // If the element exists
  599.     if(element)
  600.     {
  601.         element.setAttribute("hidden", hideMenuPreference);
  602.     }
  603.  
  604.     element = document.getElementById("webdeveloper-context");
  605.  
  606.     // If the element exists
  607.     if(element)
  608.     {
  609.         element.setAttribute("hidden", hideContextMenuPreference);
  610.     }
  611.  
  612.     element = document.getElementById("webdeveloper-context-separator1");
  613.  
  614.     // If the element exists
  615.     if(element)
  616.     {
  617.         element.setAttribute("hidden", hideContextMenuPreference);
  618.     }
  619. }
  620.  
  621. // Clears the applied styles
  622. function webdeveloper_clearAppliedStyles()
  623. {
  624.     webdeveloper_appliedStyles = new Array();
  625.  
  626.     webdeveloper_configureElement(document.getElementById("webdeveloper-statusbar-panel"), "hidden", true);
  627. }
  628.  
  629. // Configures the element with the given attribute and value
  630. function webdeveloper_configureElement(element, attribute, value)
  631. {
  632.     // If the element exists
  633.     if(element)
  634.     {
  635.         // If the value is set
  636.         if(value)
  637.         {
  638.             element.setAttribute(attribute, value);
  639.         }
  640.         else
  641.         {
  642.             element.removeAttribute(attribute);
  643.         }
  644.     }
  645. }
  646.  
  647. // Configures the element based on whether the applied style exists
  648. function webdeveloper_configureElementByAppliedStyle(element, attribute, id)
  649. {
  650.     webdeveloper_configureElement(element, attribute, webdeveloper_contains(webdeveloper_appliedStyles, id));
  651. }
  652.  
  653. // Configure the keyboard shortcuts
  654. function webdeveloper_configureKeyboardShortcuts(reset)
  655. {
  656.     var bookmarklet         = null;
  657.     var id                  = null;
  658.     var key                 = null;
  659.     var keyElement          = null;
  660.     var keyPreference       = null;
  661.     var keyPreferenceValue  = null;
  662.     var keys                = null;
  663.     var keySet              = null;
  664.     var keysLength          = null;
  665.     var mainDocument        = null;
  666.     var path                = null;
  667.     var success             = false;
  668.     var toolCount           = webdeveloper_getIntegerPreference("webdeveloper.tool.count", true);
  669.     var url                 = null;
  670.     var viewSourceWithCount = webdeveloper_getIntegerPreference("webdeveloper.view.source.with.count", true);
  671.     var windowEnumeration   = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getEnumerator("navigator:browser");
  672.  
  673.     // Loop through the open windows
  674.     while(windowEnumeration.hasMoreElements())
  675.     {
  676.         mainDocument = windowEnumeration.getNext().document;
  677.  
  678.         // If a main document was found
  679.         if(mainDocument)
  680.         {
  681.             keySet = mainDocument.getElementById("mainKeyset");
  682.  
  683.             // If the key set was not found
  684.             if(!keySet)
  685.             {
  686.                 keySet = mainDocument.getElementById("navKeys");
  687.             }
  688.  
  689.             // If the key set was found
  690.             if(keySet)
  691.             {
  692.                 keys       = keySet.childNodes;
  693.                 keysLength = keys.length;
  694.  
  695.                 // Loop through the keys
  696.                 for(var i = 0; i < keysLength; i++)
  697.                 {
  698.                     key = keys.item(i);
  699.  
  700.                     // If the key has an id starting with webdeveloper
  701.                     if(key.hasAttribute("id") && key.getAttribute("id").indexOf("webdeveloper-") == 0)
  702.                     {
  703.                         id = key.getAttribute("id").split("-").join(".");
  704.  
  705.                         // If the key preference is set
  706.                         if(webdeveloper_isPreferenceSet(id))
  707.                         {
  708.                             keyPreferenceValue = webdeveloper_getStringPreference(id, true);
  709.  
  710.                             key.setAttribute("key", keyPreferenceValue);
  711.  
  712.                             // If the key preference value is set
  713.                             if(keyPreferenceValue)
  714.                             {
  715.                                 key.setAttribute("disabled", false);
  716.                             }
  717.                             else
  718.                             {
  719.                                 key.setAttribute("disabled", true);
  720.                             }
  721.                         }
  722.                         else if(!reset)
  723.                         {
  724.                             webdeveloper_setStringPreference(id, key.getAttribute("key"));
  725.                         }
  726.  
  727.                         success = true;
  728.                     }
  729.                 }
  730.  
  731.                 // Loop through the possible tools
  732.                 for(i = 1; i <= toolCount; i++)
  733.                 {
  734.                     bookmarklet   = "webdeveloper.tool." + i + ".bookmarklet";
  735.                     keyPreference = "webdeveloper.tool." + i + ".key";
  736.                     keyElement    = mainDocument.getElementById(keyPreference);
  737.                     path          = "webdeveloper.tool." + i + ".path";
  738.                     url           = "webdeveloper.tool." + i + ".url";
  739.  
  740.                     // If the bookmarklet, path or URL preference and key preference is set
  741.                     if((webdeveloper_isPreferenceSet(bookmarklet) || webdeveloper_isPreferenceSet(path) || webdeveloper_isPreferenceSet(url)) && webdeveloper_isPreferenceSet(keyPreference))
  742.                     {
  743.                         keyPreferenceValue = webdeveloper_getStringPreference(keyPreference, true);
  744.  
  745.                         // If the key preference value is set
  746.                         if(keyPreferenceValue)
  747.                         {
  748.                             key = mainDocument.createElement("key");
  749.  
  750.                             key.setAttribute("id", keyPreference);
  751.                             key.setAttribute("key", keyPreferenceValue);
  752.                             key.setAttribute("modifiers", "accel,shift");
  753.  
  754.                             // If the bookmarklet preference is set
  755.                             if(webdeveloper_getStringPreference(bookmarklet, true))
  756.                             {
  757.                                 key.setAttribute("oncommand", "webdeveloper_runBookmarklet('" + encodeURIComponent(webdeveloper_getStringPreference(bookmarklet, true)).replace(new RegExp("'", "gi"), "\\'") + "')");
  758.                             }
  759.                             else if(webdeveloper_getStringPreference(path, true))
  760.                             {
  761.                                 key.setAttribute("oncommand", "webdeveloper_loadApplicationWithURL('" + webdeveloper_getStringPreference(path, true).replace(/\\/gi, "\\\\") + "', getBrowser().currentURI.spec)");
  762.                             }
  763.                             else
  764.                             {
  765.                                 key.setAttribute("oncommand", "webdeveloper_loadURL('" + webdeveloper_getStringPreference(url, true) + "' + encodeURIComponent(getBrowser().currentURI.spec))");
  766.                             }
  767.  
  768.                             keySet.appendChild(key);
  769.                         }
  770.                     }
  771.                     else
  772.                     {
  773.                         webdeveloper_removeElement(keyElement);
  774.                     }
  775.                 }
  776.  
  777.                 // Loop through the possible view source with options
  778.                 for(i = 1; i <= viewSourceWithCount; i++)
  779.                 {
  780.                     keyPreference = "webdeveloper.view.source.with." + i + ".key";
  781.                     keyElement    = mainDocument.getElementById(keyPreference);
  782.                     path          = "webdeveloper.view.source.with." + i + ".path";
  783.  
  784.                     // If the path and key preferences are set
  785.                     if(webdeveloper_isPreferenceSet(path) && webdeveloper_isPreferenceSet(keyPreference))
  786.                     {
  787.                         keyPreferenceValue = webdeveloper_getStringPreference(keyPreference, true);
  788.  
  789.                         // If the key preference value is set
  790.                         if(keyPreferenceValue)
  791.                         {
  792.                             key = mainDocument.createElement("key");
  793.  
  794.                             key.setAttribute("id", keyPreference);
  795.                             key.setAttribute("key", keyPreferenceValue);
  796.                             key.setAttribute("modifiers", "accel,shift");
  797.                             key.setAttribute("oncommand", "webdeveloper_loadApplicationWithSource('" + webdeveloper_getStringPreference(path, true).replace(/\\/gi, "\\\\") + "')");
  798.                             keySet.appendChild(key);
  799.                         }
  800.                     }
  801.                     else
  802.                     {
  803.                         webdeveloper_removeElement(keyElement);
  804.                     }
  805.                 }
  806.             }
  807.         }
  808.     }
  809.  
  810.     return success;
  811. }
  812.  
  813. // Copies the elements ancestors to the clipboard
  814. function webdeveloper_copyElementAncestors(event)
  815. {
  816.     var informationElement = document.getElementById("webdeveloper-information");
  817.     var keyCode            = event.charCode;
  818.  
  819.     // If the information element is set and the key code is set and is 99
  820.     if(informationElement && keyCode && keyCode == 99)
  821.     {
  822.         Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(informationElement.value);
  823.  
  824.         event.preventDefault();
  825.     }
  826. }
  827.  
  828. // Disables the given preference
  829. function webdeveloper_disablePreference(element, preference)
  830. {
  831.     // If the element and preference are set
  832.     if(element && preference)
  833.     {
  834.         webdeveloper_setBooleanPreference(preference, !webdeveloper_convertToBoolean(element.getAttribute("checked")));
  835.     }
  836. }
  837.  
  838. // Displays the elements ancestors in the information bar
  839. function webdeveloper_displayElementAncestors(event)
  840. {
  841.     var eventTarget        = event.target;
  842.     var informationElement = document.getElementById("webdeveloper-information");
  843.  
  844.     // If there is a target and the information element is set
  845.     if(eventTarget && informationElement)
  846.     {
  847.         var tagName = eventTarget.tagName;
  848.  
  849.         // If the tag name is set and does not equal scrollbar
  850.         if(tagName && tagName != "scrollbar")
  851.         {
  852.             var ancestorList   = webdeveloper_getElementAncestors(eventTarget);
  853.             var ancestorLength = ancestorList.length;
  854.             var ancestorText   = "";
  855.  
  856.             // Loop through the ancestors
  857.             for(var i = 0; i < ancestorLength; i++)
  858.             {
  859.                 ancestorText += webdeveloper_getElementDescription(ancestorList[i]) + " > ";
  860.             }
  861.  
  862.             informationElement.value = ancestorText + webdeveloper_getElementDescription(eventTarget);
  863.  
  864.             webdeveloper_configureElement(document.getElementById("webdeveloper-information-text-toolbar"), "hidden", false);
  865.  
  866.             event.preventDefault();
  867.         }
  868.     }
  869. }
  870.  
  871. // Enables the given preference
  872. function webdeveloper_enablePreference(element, preference)
  873. {
  874.     // If the element and preference are set
  875.     if(element && preference)
  876.     {
  877.         webdeveloper_setBooleanPreference(preference, webdeveloper_convertToBoolean(element.getAttribute("checked")));
  878. /*
  879.         var checked = element.getAttribute("checked");
  880.  
  881.         // If the element is checked (explicit check required)
  882.         if(checked)
  883.         {
  884.             webdeveloper_setBooleanPreference(preference, true);
  885.         }
  886.         else
  887.         {
  888.             webdeveloper_setBooleanPreference(preference, false);
  889.         }
  890. */
  891.     }
  892. }
  893.  
  894. // Formats a file size
  895. function webdeveloper_formatFileSize(fileSize)
  896. {
  897.     // If the file size is set
  898.     if(fileSize)
  899.     {
  900.         var stringBundle = document.getElementById("webdeveloper-string-bundle");
  901.  
  902.         // If the file size is greater than a kilobyte
  903.         if(fileSize > 1024)
  904.         {
  905.             return Math.round(fileSize / 1024) + " " + stringBundle.getString("webdeveloper_kilobytes");
  906.         }
  907.         else
  908.         {
  909.             return fileSize + " " + stringBundle.getString("webdeveloper_bytes");
  910.         }
  911.     }
  912.     else
  913.     {
  914.         return "";
  915.     }
  916. }
  917.  
  918. // Generates a document in a new tab or window
  919. function webdeveloper_generateDocument(url)
  920. {
  921.     var generatedPage = null;
  922.     var request       = new XMLHttpRequest();
  923.  
  924.     // If the open tabs preference is set to true
  925.     if(webdeveloper_getBooleanPreference("webdeveloper.open.tabs", true))
  926.     {
  927.         getBrowser().selectedTab = getBrowser().addTab(url);
  928.  
  929.         generatedPage = window;
  930.     }
  931.     else
  932.     {
  933.         generatedPage = window.open(url);
  934.     }
  935.  
  936.     // This must be done to make generated content render
  937.     request.open("get", "about:blank", false);
  938.     request.send(null);
  939.  
  940.     return generatedPage.content.document;
  941. }
  942.  
  943. // Returns a description for an element
  944. function webdeveloper_getElementDescription(element)
  945. {
  946.     var description = null;
  947.  
  948.     // If the element and tag name are set
  949.     if(element && element.tagName)
  950.     {
  951.         description = element.tagName.toLowerCase();
  952.  
  953.         // If the element has an id attribute
  954.         if(element.hasAttribute("id"))
  955.         {
  956.             description += " #" + element.getAttribute("id");
  957.         }
  958.  
  959.         // If the element has a class attribute
  960.         if(element.hasAttribute("class"))
  961.         {
  962.             description += " ." + element.getAttribute("class");
  963.         }
  964.     }
  965.  
  966.     return description;
  967. }
  968.  
  969. // Opens the help
  970. function webdeveloper_help()
  971. {
  972.     webdeveloper_loadURL("http://chrispederick.com/work/web-developer/help/");
  973. }
  974.  
  975. // Initializes the extension
  976. function webdeveloper_initialize(event)
  977. {
  978.     // Try to get the window content
  979.     try
  980.     {
  981.         var windowContent = window.getBrowser();
  982.     
  983.         // If the window content is set
  984.         if(windowContent)
  985.         {
  986.             var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService);
  987.             var dashboard      = document.getElementById("webdeveloper-dashboard");
  988.             var tabBox         = windowContent.mTabBox;
  989.     
  990.             webdeveloper_upgrade();
  991.             webdeveloper_setupDefaultOptions();
  992.             webdeveloper_setupLocalizedOptions();
  993.             webdeveloper_configureKeyboardShortcuts(false);
  994.             webdeveloper_changeOptions();
  995.     
  996.             windowContent.addEventListener("load", webdeveloper_pageLoad, true);
  997.             windowContent.addEventListener("unload", webdeveloper_pageUnload, true);
  998.     
  999.             // If the dashboard is set
  1000.             if(dashboard)
  1001.             {
  1002.                 webdeveloper_setupDashboardPosition(webdeveloper_getStringPreference("webdeveloper.dashboard.position", true));
  1003.             }
  1004.     
  1005.             // If the console service is set
  1006.             if(consoleService)
  1007.             {
  1008.                 consoleService.registerListener(WebDeveloperErrorConsoleListener);
  1009.             }
  1010.     
  1011.             // If the tab box is set
  1012.             if(tabBox)
  1013.             {
  1014.                 tabBox.addEventListener("select", webdeveloper_tabSelect, false);
  1015.             }
  1016.     
  1017.             window.removeEventListener("load", webdeveloper_initialize, false);
  1018.         }
  1019.     }
  1020.     catch(exception)
  1021.     {
  1022.         // Do nothing
  1023.     }
  1024. }
  1025.  
  1026. // Returns true if the DOM Inspector is available
  1027. function webdeveloper_isDOMInspectorAvailable()
  1028. {
  1029.     try
  1030.     {
  1031.         Components.classes["@mozilla.org/inspector/dom-utils;1"].getService(Components.interfaces.inIDOMUtils);
  1032.  
  1033.         return true;
  1034.     }
  1035.     catch(exception)
  1036.     {
  1037.         return false;
  1038.     }
  1039. }
  1040.  
  1041. // Returns true if the DOM Inspector chrome is available
  1042. function webdeveloper_isDOMInspectorChromeAvailable()
  1043. {
  1044.     // If the inspectDOMDocument method is available
  1045.     if(typeof inspectDOMDocument == "function")
  1046.     {
  1047.         return true;
  1048.     }
  1049.     
  1050.     return false;
  1051. }
  1052.  
  1053. // Returns true if the information text toolbar is in use
  1054. function webdeveloper_isInformationTextToolbarInUse()
  1055. {
  1056.     // If one of the features that use the information text toolbar is enabled
  1057.     if(webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-display-element-information") || webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-outline-current-element") || webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-view-style-information"))
  1058.     {
  1059.         return true;
  1060.     }
  1061.  
  1062.     return false;
  1063. }
  1064.  
  1065. // Loads the given URL
  1066. function webdeveloper_loadURL(url)
  1067. {
  1068.     var oldTab = getBrowser().selectedTab;
  1069.  
  1070.     webdeveloper_generateDocument(url);
  1071.  
  1072.     // If the open tabs in background preference is set to true
  1073.     if(webdeveloper_getBooleanPreference("webdeveloper.open.tabs.background", true))
  1074.     {
  1075.         getBrowser().selectedTab = oldTab;
  1076.     }
  1077. }
  1078.  
  1079. // Logs a debug message to the error console
  1080. function webdeveloper_logDebug(message)
  1081. {
  1082.     // If the debug preference is set
  1083.     if(webdeveloper_getBooleanPreference("webdeveloper.debug", true))
  1084.     {
  1085.         Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService).logStringMessage("Web Developer: " + message);
  1086.         webdeveloper_openErrorConsole(false);
  1087.     }
  1088. }
  1089.  
  1090. // Opens the error console
  1091. function webdeveloper_openErrorConsole(toggle)
  1092. {
  1093.     // If the open error console in dashboard preference is set to true
  1094.     if(webdeveloper_getBooleanPreference("webdeveloper.error.console.dashboard", true))
  1095.     {
  1096.         var errorConsole = document.getElementById("webdeveloper-string-bundle").getString("webdeveloper_errorConsole");
  1097.  
  1098.         // If the error console is already open in the dashboard
  1099.         if(webdeveloper_isOpenInDashboard(errorConsole))
  1100.         {
  1101.             // If toggling the console
  1102.             if(toggle)
  1103.             {
  1104.                 webdeveloper_closeInDashboard(errorConsole);
  1105.             }
  1106.             else
  1107.             {
  1108.                 webdeveloper_selectInDashboard(errorConsole);
  1109.             }
  1110.         }
  1111.         else
  1112.         {
  1113.             webdeveloper_openInDashboard(errorConsole, "chrome://global/content/console.xul");
  1114.         }
  1115.     }
  1116.     else
  1117.     {
  1118.         webdeveloper_javaScriptPreviousTime = webdeveloper_javaScriptCurrentTime;
  1119.         webdeveloper_javaScriptCurrentTime  = new Date().getTime();
  1120.  
  1121.         // If the previous time is not set or the current time is greater than a second different from the previous time
  1122.         if(!webdeveloper_javaScriptPreviousTime || webdeveloper_javaScriptCurrentTime - webdeveloper_javaScriptPreviousTime > 1500)
  1123.         {
  1124.             toJavaScriptConsole();
  1125.         }
  1126.     }
  1127. }
  1128.  
  1129. // Opens a toolbar button automatically if another toolbar button is open on the toolbar
  1130. function webdeveloper_openToolbarButton(currentToolbarButton)
  1131. {
  1132.     // If the toolbar button is set and is not open
  1133.     if(currentToolbarButton && !currentToolbarButton.open)
  1134.     {
  1135.         var toolbarButton        = null;
  1136.         var toolbarButtons       = currentToolbarButton.parentNode.getElementsByTagName("toolbarbutton");
  1137.         var toolbarButtonsLength = toolbarButtons.length;
  1138.  
  1139.         // Loop through the toolbar buttons
  1140.         for(var i = 0; i < toolbarButtonsLength; i++)
  1141.         {
  1142.             toolbarButton = toolbarButtons.item(i);
  1143.  
  1144.             // If the toolbar button is set, is not the same toolbar button and is open
  1145.             if(toolbarButton && toolbarButton != currentToolbarButton && toolbarButton.open)
  1146.             {
  1147.                 toolbarButton.open        = false;
  1148.                 currentToolbarButton.open = true;
  1149.  
  1150.                 break;
  1151.             }
  1152.         }
  1153.     }
  1154. }
  1155.  
  1156. // Displays the options dialog
  1157. function webdeveloper_options(openPage)
  1158. {
  1159.     // If an open page is set
  1160.     if(openPage)
  1161.     {
  1162.         window.openDialog("chrome://webdeveloper/content/options/options.xul", "webdeveloper-options-dialog", "centerscreen,chrome,modal,resizable", openPage);
  1163.     }
  1164.     else
  1165.     {
  1166.         window.openDialog("chrome://webdeveloper/content/options/options.xul", "webdeveloper-options-dialog", "centerscreen,chrome,modal,resizable");
  1167.     }
  1168.  
  1169.     webdeveloper_changeOptions();
  1170. }
  1171.  
  1172. // Handles the page being loaded
  1173. function webdeveloper_pageLoad(event)
  1174. {
  1175.     var contentDocument = webdeveloper_getPageLoadEventContentDocument(event);
  1176.  
  1177.     // If the content document is set
  1178.     if(contentDocument)
  1179.     {
  1180.         // Reset the display line guides and display ruler features
  1181.         webdeveloper_configureElement(document.getElementById("webdeveloper-line-guides-toolbar"), "hidden", true);
  1182.         webdeveloper_configureElement(document.getElementById("webdeveloper-ruler-toolbar"), "hidden", true);
  1183.         webdeveloper_removeAppliedStyle("webdeveloper-display-line-guides");
  1184.         webdeveloper_removeAppliedStyle("webdeveloper-display-ruler");
  1185.  
  1186.         webdeveloper_updateMetaRedirects(getBrowser().selectedBrowser);
  1187.         webdeveloper_updateRenderMode(contentDocument);
  1188.  
  1189.         // If the persist features preference is set and is true
  1190.         if(webdeveloper_getBooleanPreference("webdeveloper.persist.features", true))
  1191.         {
  1192.             webdeveloper_applyStyleSheets(false);
  1193.         }
  1194.         else
  1195.         {
  1196.             // Reset the information text toolbar
  1197.             webdeveloper_configureElement(document.getElementById("webdeveloper-information-text-toolbar"), "hidden", true);
  1198.  
  1199.             webdeveloper_clearAppliedStyles();
  1200.         }
  1201.     }
  1202. }
  1203.  
  1204. // Handles the page being unloaded
  1205. function webdeveloper_pageUnload(event)
  1206. {
  1207.     var contentDocument = webdeveloper_getPageLoadEventContentDocument(event);
  1208.  
  1209.     // If the content document is set
  1210.     if(contentDocument)
  1211.     {
  1212.         webdeveloper_updateCSSStatus();
  1213.         webdeveloper_updateJavaScriptStatus();
  1214.     }
  1215. }
  1216.  
  1217. // Remove applied style
  1218. function webdeveloper_removeAppliedStyle(id)
  1219. {
  1220.     // If the id is in the applied styles
  1221.     if(webdeveloper_contains(webdeveloper_appliedStyles, id))
  1222.     {
  1223.         var appliedStylesLength = webdeveloper_appliedStyles.length;
  1224.  
  1225.         // Loop through the applied styles
  1226.         for(var i = 0; i < appliedStylesLength; i++)
  1227.         {
  1228.             // If this style sheet is in the applied styles
  1229.             if(webdeveloper_appliedStyles[i] == id)
  1230.             {
  1231.                 webdeveloper_appliedStyles.splice(i, 1);
  1232.                 break;
  1233.             }
  1234.         }
  1235.  
  1236.         // If the only applied style has been removed
  1237.         if(webdeveloper_appliedStyles.length == 0)
  1238.         {
  1239.             webdeveloper_configureElement(document.getElementById("webdeveloper-statusbar-panel"), "hidden", true);
  1240.         }
  1241.     }
  1242. }
  1243.  
  1244. // Removes the outline from an element
  1245. function webdeveloper_removeElementOutline(element)
  1246. {
  1247.     // If the element is set
  1248.     if(element)
  1249.     {
  1250.         element.style.MozOutline = "";
  1251.  
  1252.         // If the element has an empty style attribute
  1253.         if(element.hasAttribute("style") && element.getAttribute("style") == "")
  1254.         {
  1255.             element.removeAttribute("style");
  1256.         }
  1257.     }
  1258. }
  1259.  
  1260. // Removes all the generated menu items from the menu
  1261. function webdeveloper_removeGeneratedMenuItems(menu)
  1262. {
  1263.     var generatedMenuItems = new Array();
  1264.     var menuItem           = null;
  1265.     var menuItems          = menu.childNodes;
  1266.     var menuItemsLength    = menuItems.length;
  1267.  
  1268.     // Loop through the menu items
  1269.     for(var i = 0; i < menuItemsLength; i++)
  1270.     {
  1271.         menuItem = menuItems.item(i);
  1272.  
  1273.         // If this is a generated menu item
  1274.         if(menuItem && menuItem.hasAttribute("class") && menuItem.getAttribute("class") == "webdeveloper-generated-menu")
  1275.         {
  1276.             generatedMenuItems.push(menuItem);
  1277.         }
  1278.     }
  1279.  
  1280.     menuItemsLength = generatedMenuItems.length;
  1281.  
  1282.     // Loop through the generated menu items
  1283.     for(i = 0; i < menuItemsLength; i++)
  1284.     {
  1285.         menu.removeChild(generatedMenuItems[i]);
  1286.     }
  1287. }
  1288.  
  1289. // Removes the style sheet with the given id
  1290. function webdeveloper_removeStyleSheet(id)
  1291. {
  1292.     var documentList   = webdeveloper_getDocuments(webdeveloper_getContentWindow());
  1293.     var documentLength = documentList.length;
  1294.  
  1295.     // Loop through the documents
  1296.     for(var i = 0; i < documentLength; i++)
  1297.     {
  1298.         webdeveloper_removeElement(documentList[i].getElementById(id));
  1299.     }
  1300.  
  1301.     webdeveloper_removeAppliedStyle(id);
  1302. }
  1303.  
  1304. // Resets the CSS status button
  1305. function webdeveloper_resetCSSStatus()
  1306. {
  1307.     var cssButton = document.getElementById("webdeveloper-css-statusbar");
  1308.  
  1309.     webdeveloper_javaScriptCurrentTime  = null;
  1310.     webdeveloper_javaScriptPreviousTime = null;
  1311.  
  1312.     // If the CSS button exists
  1313.     if(cssButton)
  1314.     {
  1315.         // If the CSS button has a class attribute
  1316.         if(cssButton.hasAttribute("class"))
  1317.         {
  1318.             cssButton.removeAttribute("class");
  1319.         }
  1320.  
  1321.         // If the CSS button has a tooltip text attribute
  1322.         if(cssButton.hasAttribute("tooltiptext"))
  1323.         {
  1324.             cssButton.removeAttribute("tooltiptext");
  1325.         }
  1326.  
  1327.         // If the toolbar preference is set to text and the CSS button has a label attribute
  1328.         if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text" && cssButton.hasAttribute("label"))
  1329.         {
  1330.             cssButton.removeAttribute("label");
  1331.         }
  1332.     }
  1333. }
  1334.  
  1335. // Resets the JavaScript status button
  1336. function webdeveloper_resetJavaScriptStatus()
  1337. {
  1338.     var javaScriptButton = document.getElementById("webdeveloper-javascript-statusbar");
  1339.  
  1340.     webdeveloper_javaScriptCurrentTime  = null;
  1341.     webdeveloper_javaScriptPreviousTime = null;
  1342.  
  1343.     // If the JavaScript button exists
  1344.     if(javaScriptButton)
  1345.     {
  1346.         // If JavaScript is enabled
  1347.         if(webdeveloper_getBooleanPreference("javascript.enabled", false))
  1348.         {
  1349.             // If the JavaScript button has a class attribute
  1350.             if(javaScriptButton.hasAttribute("class"))
  1351.             {
  1352.                 javaScriptButton.removeAttribute("class");
  1353.             }
  1354.  
  1355.             // If the JavaScript button has a tooltip text attribute
  1356.             if(javaScriptButton.hasAttribute("tooltiptext"))
  1357.             {
  1358.                 javaScriptButton.removeAttribute("tooltiptext");
  1359.             }
  1360.  
  1361.             // If the toolbar preference is set to text and the JavaScript button has a label attribute
  1362.             if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text" && javaScriptButton.hasAttribute("label"))
  1363.             {
  1364.                 javaScriptButton.removeAttribute("label");
  1365.             }
  1366.         }
  1367.         else
  1368.         {
  1369.             var stringBundle = document.getElementById("webdeveloper-string-bundle");
  1370.  
  1371.             // If the JavaScript button does not have a class attribute or it is not set to disabled
  1372.             if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "disabled")
  1373.             {
  1374.                 javaScriptButton.setAttribute("class", "disabled");
  1375.                 javaScriptButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptDisabledTooltip"));
  1376.  
  1377.                 // If the toolbar preference is set to text
  1378.                 if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
  1379.                 {
  1380.                     javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptDisabledLabel"));
  1381.                 }
  1382.             }
  1383.         }
  1384.     }
  1385. }
  1386.  
  1387. // Resets the page
  1388. function webdeveloper_resetPage()
  1389. {
  1390.     webdeveloper_applyStyleSheets(true);
  1391.     webdeveloper_clearAppliedStyles();
  1392.  
  1393.     webdeveloper_outlinedElements = new Array();
  1394. }
  1395.  
  1396. // Runs the given bookmarklet
  1397. function webdeveloper_runBookmarklet(bookmarklet)
  1398. {
  1399.     eval(decodeURIComponent(bookmarklet));
  1400. }
  1401.  
  1402. // Sets up the default options
  1403. function webdeveloper_setupDefaultOptions()
  1404. {
  1405.     // Set default custom colors
  1406.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.1.color", "#ff0000");
  1407.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.2.color", "#33ff33");
  1408.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.3.color", "#3333ff");
  1409.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.4.color", "#ff0000");
  1410.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.5.color", "#33ff33");
  1411.  
  1412.     // Set default dashboard position
  1413.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.dashboard.position", "bottom");
  1414.  
  1415.     // Set default edit CSS preferences
  1416.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.edit.color.background", "#ffffff");
  1417.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.edit.color.text", "#000000");
  1418.     webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.edit.font.size", 12);
  1419.     webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.edit.update.frequency", 2000);
  1420.  
  1421.     // Set default feature tooltip colors
  1422.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.feature.tooltip.color.background", "#ffff99");
  1423.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.feature.tooltip.color.border", "#ffcc66");
  1424.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.feature.tooltip.color.text", "#000000");
  1425.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.feature.tooltip.opacity", "0.9");
  1426.  
  1427.     // Set default generated content font size
  1428.     webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.generated.content.font.size", 12);
  1429.  
  1430.     // Set default information preference
  1431.     webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.information.tidy", true);
  1432.  
  1433.     // Set default line guides preference
  1434.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.line.guides.color", "#000000");
  1435.  
  1436.     // Set default magnification preference
  1437.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.magnification.level", "2");
  1438.  
  1439.     // Set default open tabs preference
  1440.     webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.open.tabs", true);
  1441.  
  1442.     // Set default populate form fields email
  1443.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.populate.form.fields.email", "example@example.com");
  1444.  
  1445.     // Set default style information preference
  1446.     webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.style.information.dashboard", true);
  1447.  
  1448.     // Set default accessibility preferences
  1449.     webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.validate.local.accessibility.section508", true);
  1450.     webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.validate.local.accessibility.wai.priority1", true);
  1451.  
  1452.     // Set default CSS profile preference
  1453.     webdeveloper_setStringPreferenceIfNotSet("webdeveloper.validate.local.css.profile", "css21");
  1454. }
  1455.  
  1456. // Sets up the localized options
  1457. function webdeveloper_setupLocalizedOptions()
  1458. {
  1459.     var stringBundle = document.getElementById("webdeveloper-string-bundle");
  1460.  
  1461.     // If the string bundle is set
  1462.     if(stringBundle)
  1463.     {
  1464.         // Set default resize count
  1465.         webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.resize.count", 1);
  1466.  
  1467.         // Set 800x600
  1468.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.resize.1.description", stringBundle.getString("webdeveloper_resize800x600"));
  1469.         webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.resize.1.width", 800);
  1470.         webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.resize.1.height", 600);
  1471.  
  1472.         // Set default tool count
  1473.         webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.tool.count", 6);
  1474.  
  1475.         // Set CSS validator
  1476.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.1.description", stringBundle.getString("webdeveloper_validateCSS"));
  1477.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.1.url", "http://jigsaw.w3.org/css-validator/validator?profile=css21&warning=0&uri=");
  1478.  
  1479.         // Set feed validator
  1480.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.2.description", stringBundle.getString("webdeveloper_validateFeed"));
  1481.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.2.url", "http://validator.w3.org/feed/check.cgi?url=");
  1482.  
  1483.         // Set HTML validator
  1484.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.3.description", stringBundle.getString("webdeveloper_validateHTML"));
  1485.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.3.key", "H");
  1486.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.3.url", "http://validator.w3.org/check?verbose=1&uri=");
  1487.  
  1488.         // Set links validator
  1489.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.4.description", stringBundle.getString("webdeveloper_validateLinks"));
  1490.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.4.url", "http://validator.w3.org/checklink?check=Check&hide_type=all&summary=on&uri=");
  1491.  
  1492.         // Set section 508 validator
  1493.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.5.description", stringBundle.getString("webdeveloper_validateSection508"));
  1494.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.5.url", "http://www.cynthiasays.com/mynewtester/cynthia.exe?rptmode=-1&url1=");
  1495.  
  1496.         // Set WAI validator
  1497.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.6.description", stringBundle.getString("webdeveloper_validateWAI"));
  1498.         webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.6.url", "http://www.cynthiasays.com/mynewtester/cynthia.exe?rptmode=2&url1=");
  1499.     }
  1500. }
  1501.  
  1502. // Sorts two images
  1503. function webdeveloper_sortImages(imageOne, imageTwo)
  1504. {
  1505.     // If both images are set
  1506.     if(imageOne && imageTwo)
  1507.     {
  1508.         var imageOneSrc = imageOne.src;
  1509.         var imageTwoSrc = imageTwo.src;
  1510.  
  1511.         // If the images are equal
  1512.         if(imageOneSrc == imageTwoSrc)
  1513.         {
  1514.             return 0;
  1515.         }
  1516.         else if(imageOneSrc < imageTwoSrc)
  1517.         {
  1518.             return -1;
  1519.         }
  1520.     }
  1521.  
  1522.     return 1;
  1523. }
  1524.  
  1525. // Handles a tab being selected
  1526. function webdeveloper_tabSelect(event)
  1527. {
  1528.     var selectedTab = getBrowser().mTabBox.selectedIndex;
  1529.  
  1530.     // If the selected tab is different
  1531.     if(selectedTab != webdeveloper_selectedTab)
  1532.     {
  1533.         webdeveloper_selectedTab = selectedTab;
  1534.  
  1535.         webdeveloper_resetCSSStatus();
  1536.         webdeveloper_resetJavaScriptStatus();
  1537.         webdeveloper_updateAppliedStyles();
  1538.         webdeveloper_updateRenderMode(webdeveloper_getContentDocument());
  1539.  
  1540.         // Reset the display line guides and display ruler toolbars
  1541.         webdeveloper_configureElement(document.getElementById("webdeveloper-line-guides-toolbar"), "hidden", !webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-display-line-guides"));
  1542.         webdeveloper_configureElement(document.getElementById("webdeveloper-ruler-toolbar"), "hidden", !webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-display-ruler"));
  1543.  
  1544.         // Reset the information text toolbar
  1545.         webdeveloper_configureElement(document.getElementById("webdeveloper-information-text-toolbar"), "hidden", !webdeveloper_isInformationTextToolbarInUse());
  1546.     }
  1547. }
  1548.  
  1549. // Tidies a list of images by removing duplicates and sorting
  1550. function webdeveloper_tidyImages(imageList)
  1551. {
  1552.     var image              = null;
  1553.     var imageListLength    = imageList.length;
  1554.     var imageSrc           = null;
  1555.     var newImageList       = new Array();
  1556.     var newImageListLength = null;
  1557.     var tidiedImageList    = new Array();
  1558.  
  1559.     // Loop through the images
  1560.     for(var i = 0; i < imageListLength; i++)
  1561.     {
  1562.         image    = imageList[i];
  1563.         imageSrc = image.src;
  1564.  
  1565.         // If the image src is set and does not end in '.xul'
  1566.         if(imageSrc && !imageSrc.endsWith(".xul"))
  1567.         {
  1568.             newImageList.push(image);
  1569.         }
  1570.     }
  1571.  
  1572.     newImageList.sort(webdeveloper_sortImages);
  1573.  
  1574.     newImageListLength = newImageList.length;
  1575.  
  1576.     // Loop through the images
  1577.     for(i = 0; i < newImageListLength; i++)
  1578.     {
  1579.         image = newImageList[i];
  1580.  
  1581.         // If this is not the last image and the image is the same as the next image
  1582.         if(i + 1 < newImageListLength && image.src == newImageList[i + 1].src)
  1583.         {
  1584.             continue;
  1585.         }
  1586.  
  1587.         tidiedImageList.push(image);
  1588.     }
  1589.  
  1590.     return tidiedImageList;
  1591. }
  1592.  
  1593. // Toggles the applied style with the given id
  1594. function webdeveloper_toggleAppliedStyle(element, id)
  1595. {
  1596.     webdeveloper_removeAppliedStyle(id);
  1597.  
  1598.     // If the menu is checked
  1599.     if(element && webdeveloper_convertToBoolean(element.getAttribute("checked")))
  1600.     {
  1601.         webdeveloper_addAppliedStyle(id);
  1602.     }
  1603. }
  1604.  
  1605. // Toggles the feature tooltip styles
  1606. function webdeveloper_toggleFeatureTooltipStyles(element, styleSheetId, selectors)
  1607. {
  1608.     webdeveloper_removeStyleSheet(styleSheetId, false);
  1609.  
  1610.     // If the menu is checked
  1611.     if(webdeveloper_convertToBoolean(element.getAttribute("checked")))
  1612.     {
  1613.         var colors         = " background-color: " + webdeveloper_getStringPreference("webdeveloper.feature.tooltip.color.background", true) + " !important; border-color: " + webdeveloper_getStringPreference("webdeveloper.feature.tooltip.color.border", true) + " !important; color: " + webdeveloper_getStringPreference("webdeveloper.feature.tooltip.color.text", true) + " !important; ";
  1614.         var documentList   = webdeveloper_getDocuments(webdeveloper_getContentWindow());
  1615.         var documentLength = documentList.length;
  1616.         var opacityValue   = webdeveloper_getStringPreference("webdeveloper.feature.tooltip.opacity", true);
  1617.         var opacity        = " -moz-opacity: " + opacityValue + " !important;  opacity: " + opacityValue + " !important; ";
  1618.         var pageDocument   = null;
  1619.         var styleElement   = null;
  1620.  
  1621.         // Loop through the documents
  1622.         for(var i = 0; i < documentLength; i++)
  1623.         {
  1624.             pageDocument = documentList[i];
  1625.             styleElement = pageDocument.createElement("style");
  1626.  
  1627.             styleElement.appendChild(pageDocument.createTextNode(selectors + " {" + colors + opacity + "}"));
  1628.             styleElement.setAttribute("id", styleSheetId);
  1629.             styleElement.setAttribute("type", "text/css");
  1630.  
  1631.             webdeveloper_getDocumentHeadElement(pageDocument).appendChild(styleElement);
  1632.         }
  1633.     }
  1634. }
  1635.  
  1636. // Toggles an individual style sheet
  1637. function webdeveloper_toggleIndividualStyleSheet(selectedStyleSheetHref)
  1638. {
  1639.     var currentDocument  = webdeveloper_getContentDocument();
  1640.     var styleSheet       = null;
  1641.     var styleSheetHref   = null;
  1642.     var styleSheetList   = currentDocument.styleSheets;
  1643.     var styleSheetLength = styleSheetList.length;
  1644.  
  1645.     // Loop through the style sheets
  1646.     for(var i = 0; i < styleSheetLength; i++)
  1647.     {
  1648.         styleSheet     = styleSheetList[i];
  1649.         styleSheetHref = styleSheet.href;
  1650.  
  1651.         // If this is the selected style sheet
  1652.         if(styleSheetHref == selectedStyleSheetHref)
  1653.         {
  1654.             styleSheet.disabled = !styleSheet.disabled;
  1655.         }
  1656.     }
  1657. }
  1658.  
  1659. // Toggles the style sheet with the given id
  1660. function webdeveloper_toggleStyleSheet(element, location, id)
  1661. {
  1662.     webdeveloper_removeStyleSheet(id);
  1663.  
  1664.     // If the menu is checked
  1665.     if(element && webdeveloper_convertToBoolean(element.getAttribute("checked")))
  1666.     {
  1667.         webdeveloper_addStyleSheet(location, id);
  1668.     }
  1669. }
  1670.  
  1671. // Toggles the toolbar
  1672. function webdeveloper_toggleToolbar()
  1673. {
  1674.     var toolbar = document.getElementById("webdeveloper-toolbar");
  1675.  
  1676.     toolbar.collapsed = !toolbar.collapsed;
  1677.  
  1678.     document.persist("webdeveloper-toolbar", "collapsed");
  1679. }
  1680.  
  1681. // Uninitializes the extension
  1682. function webdeveloper_uninitialize(event)
  1683. {
  1684.     // Try to get the window content
  1685.     try
  1686.     {
  1687.         var windowContent = window.getBrowser();
  1688.     
  1689.         // If the window content is set
  1690.         if(windowContent)
  1691.         {
  1692.             var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService);
  1693.             var tabBox         = windowContent.mTabBox;
  1694.     
  1695.             windowContent.removeEventListener("load", webdeveloper_pageLoad, true);
  1696.             windowContent.removeEventListener("unload", webdeveloper_pageUnload, true);
  1697.     
  1698.             // If the console service is set
  1699.             if(consoleService)
  1700.             {
  1701.                 consoleService.unregisterListener(WebDeveloperErrorConsoleListener);
  1702.             }
  1703.     
  1704.             // If the tab box is set
  1705.             if(tabBox)
  1706.             {
  1707.                 tabBox.removeEventListener("select", webdeveloper_tabSelect, false);
  1708.             }
  1709.     
  1710.             window.removeEventListener("close", webdeveloper_uninitialize, false);
  1711.         }
  1712.     }
  1713.     catch(exception)
  1714.     {
  1715.         // Do nothing
  1716.     }
  1717. }
  1718.  
  1719. // Updates the applied styles
  1720. function webdeveloper_updateAppliedStyles()
  1721. {
  1722.     webdeveloper_clearAppliedStyles();
  1723.     webdeveloper_addAppliedStyleByElement("webdeveloper-add-user-style-sheet");
  1724.     webdeveloper_addAppliedStyleByElement("webdeveloper-disable-all-styles");
  1725.     webdeveloper_addAppliedStyleByElement("webdeveloper-disable-browser-default-styles");
  1726.     webdeveloper_addAppliedStyleByElement("webdeveloper-disable-all-styles");
  1727.     webdeveloper_addAppliedStyleByElement("webdeveloper-disable-embedded-styles");
  1728.     webdeveloper_addAppliedStyleByElement("webdeveloper-disable-inline-styles");
  1729.     webdeveloper_addAppliedStyleByElement("webdeveloper-disable-linked-styles");
  1730.     webdeveloper_addAppliedStyleByElement("webdeveloper-disable-print-styles");
  1731.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-abbreviations");
  1732.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-access-keys");
  1733.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-alt-attributes");
  1734.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-anchors");
  1735.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-block-size");
  1736.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-div-order");
  1737.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-element-information");
  1738.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-form-details");
  1739.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-handheld-css");
  1740.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-id-class-details");
  1741.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-image-dimensions");
  1742.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-image-file-sizes");
  1743.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-image-paths");
  1744.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-line-guides");
  1745.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-link-details");
  1746.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-object-information");
  1747.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-print-css");
  1748.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-ruler");
  1749.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-stack-levels");
  1750.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-tab-index");
  1751.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-table-depth");
  1752.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-table-information");
  1753.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-title-attributes");
  1754.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-topographic-information");
  1755.     webdeveloper_addAppliedStyleByElement("webdeveloper-display-window-size-title");
  1756.     webdeveloper_addAppliedStyleByElement("webdeveloper-hide-background-images");
  1757.     webdeveloper_addAppliedStyleByElement("webdeveloper-hide-images");
  1758.     webdeveloper_addAppliedStyleByElement("webdeveloper-linearize-page");
  1759.     webdeveloper_addAppliedStyleByElement("webdeveloper-make-images-invisible");
  1760.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-absolute-positioned-elements");
  1761.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-all-images");
  1762.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-background-images");
  1763.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-block-level-elements");
  1764.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-current-element");
  1765.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-custom-elements");
  1766.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-deprecated-elements");
  1767.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-external-links");
  1768.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-fixed-positioned-elements");
  1769.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-floated-elements");
  1770.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-frames");
  1771.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-headings");
  1772.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-with-adjusted-dimensions");
  1773.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-with-empty-alt-attributes");
  1774.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-without-alt-attributes");
  1775.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-without-dimensions");
  1776.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-without-title-attributes");
  1777.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-links-with-ping-attributes");
  1778.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-links-without-title-attributes");
  1779.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-relative-positioned-elements");
  1780.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-table-captions");
  1781.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-table-cells");
  1782.     webdeveloper_addAppliedStyleByElement("webdeveloper-outline-all-tables");
  1783.     webdeveloper_addAppliedStyleByElement("webdeveloper-replace-images-with-alt-attributes");
  1784.     webdeveloper_addAppliedStyleByElement("webdeveloper-show-comments");
  1785.     webdeveloper_addAppliedStyleByElement("webdeveloper-small-screen-rendering");
  1786.     webdeveloper_addAppliedStyleByElement("webdeveloper-use-border-box-model");
  1787.     webdeveloper_addAppliedStyleByElement("webdeveloper-view-style-information");
  1788. }
  1789.  
  1790. // Updates the CSS status button
  1791. function webdeveloper_updateCSSStatus(error)
  1792. {
  1793.     var cssButton = document.getElementById("webdeveloper-css-statusbar");
  1794.  
  1795.     // If the CSS button is set
  1796.     if(cssButton)
  1797.     {
  1798.         var stringBundle = document.getElementById("webdeveloper-string-bundle");
  1799.  
  1800.         // If the error is set
  1801.         if(error)
  1802.         {
  1803.             var errorMessage = error.errorMessage;
  1804.  
  1805.             cssButton.setAttribute("tooltiptext", stringBundle.getFormattedString("webdeveloper_cssErrorTooltip", [errorMessage]));
  1806.  
  1807.             // If the CSS button does not have a class attribute or it is not set to error
  1808.             if(!cssButton.hasAttribute("class") || cssButton.getAttribute("class") != "error")
  1809.             {
  1810.                 cssButton.setAttribute("class", "error");
  1811.  
  1812.                 // If the toolbar preference is set to text
  1813.                 if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
  1814.                 {
  1815.                     cssButton.setAttribute("label", stringBundle.getString("webdeveloper_cssErrorLabel"));
  1816.                 }
  1817.             }
  1818.  
  1819.             // If the open CSS console error preference is set
  1820.             if(webdeveloper_getBooleanPreference("webdeveloper.open.css.console.error", true))
  1821.             {
  1822.                 webdeveloper_openErrorConsole(false);
  1823.             }
  1824.         }
  1825.         else if(!cssButton.hasAttribute("class") || cssButton.getAttribute("class") != "valid")
  1826.         {
  1827.             cssButton.setAttribute("class", "valid");
  1828.             cssButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_cssNoErrorsTooltip"));
  1829.  
  1830.             // If the toolbar preference is set to text
  1831.             if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
  1832.             {
  1833.                 cssButton.setAttribute("label", stringBundle.getString("webdeveloper_cssNoErrorsLabel"));
  1834.             }
  1835.         }
  1836.     }
  1837. }
  1838.  
  1839. // Updates the JavaScript status button
  1840. function webdeveloper_updateJavaScriptStatus(error)
  1841. {
  1842.     var javaScriptButton = document.getElementById("webdeveloper-javascript-statusbar");
  1843.  
  1844.     // If the JavaScript button is set
  1845.     if(javaScriptButton)
  1846.     {
  1847.         var stringBundle = document.getElementById("webdeveloper-string-bundle");
  1848.  
  1849.         // If the error is set
  1850.         if(error)
  1851.         {
  1852.             var errorMessage = error.errorMessage;
  1853.             var warning      = error.flags & error.warningFlag != 0;
  1854.  
  1855.             // If this is a warning
  1856.             if(warning)
  1857.             {
  1858.                 javaScriptButton.setAttribute("tooltiptext", stringBundle.getFormattedString("webdeveloper_javaScriptWarningTooltip", [errorMessage]));
  1859.  
  1860.                 // If the JavaScript button does not have a class attribute or it is not set to warning
  1861.                 if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "warning")
  1862.                 {
  1863.                     javaScriptButton.setAttribute("class", "warning");
  1864.  
  1865.                     // If the toolbar preference is set to text
  1866.                     if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
  1867.                     {
  1868.                         javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptWarningLabel"));
  1869.                     }
  1870.                 }
  1871.  
  1872.                 // If the open JavaScript console warning preference is set
  1873.                 if(webdeveloper_getBooleanPreference("webdeveloper.open.javascript.console.warning", true))
  1874.                 {
  1875.                     webdeveloper_openErrorConsole(false);
  1876.                 }
  1877.             }
  1878.             else
  1879.             {
  1880.                 javaScriptButton.setAttribute("tooltiptext", stringBundle.getFormattedString("webdeveloper_javaScriptErrorTooltip", [errorMessage]));
  1881.  
  1882.                 // If the JavaScript button does not have a class attribute or it is not set to error
  1883.                 if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "error")
  1884.                 {
  1885.                     javaScriptButton.setAttribute("class", "error");
  1886.  
  1887.                     // If the toolbar preference is set to text
  1888.                     if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
  1889.                     {
  1890.                         javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptErrorLabel"));
  1891.                     }
  1892.                 }
  1893.  
  1894.                 // If the open JavaScript console error preference is set
  1895.                 if(webdeveloper_getBooleanPreference("webdeveloper.open.javascript.console.error", true))
  1896.                 {
  1897.                     webdeveloper_openErrorConsole(false);
  1898.                 }
  1899.             }
  1900.         }
  1901.         else if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "valid")
  1902.         {
  1903.             javaScriptButton.setAttribute("class", "valid");
  1904.             javaScriptButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptNoErrorsTooltip"));
  1905.  
  1906.             // If the toolbar preference is set to text
  1907.             if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
  1908.             {
  1909.                 javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptNoErrorsLabel"));
  1910.             }
  1911.         }
  1912.     }
  1913. }
  1914.  
  1915. // Updates the meta redirects status
  1916. function webdeveloper_updateMetaRedirects(browser)
  1917. {
  1918.     // If the browser doc shell allow meta redirects is set
  1919.     if(browser && browser.docShell && browser.docShell.allowMetaRedirects)
  1920.     {
  1921.         browser.docShell.allowMetaRedirects = !webdeveloper_getBooleanPreference("webdeveloper.meta.redirects.disable", true);
  1922.     }
  1923. }
  1924.  
  1925. // Updates the options menu
  1926. function webdeveloper_updateOptionsMenu(suffix)
  1927. {
  1928.     var appliedStyles = true;
  1929.  
  1930.     // If there are no applied styles
  1931.     if(webdeveloper_appliedStyles.length == 0)
  1932.     {
  1933.         appliedStyles = false;
  1934.     }
  1935.  
  1936.     webdeveloper_configureElement(document.getElementById("webdeveloper-persist-features-" + suffix), "checked", webdeveloper_getBooleanPreference("webdeveloper.persist.features", true));
  1937.     webdeveloper_configureElement(document.getElementById("webdeveloper-reset-page-" + suffix), "disabled", !appliedStyles);
  1938. }
  1939.  
  1940. // Updates the render mode status button
  1941. function webdeveloper_updateRenderMode(currentDocument)
  1942. {
  1943.     var element = document.getElementById("webdeveloper-render-mode-statusbar");
  1944.  
  1945.     // If the render mode button exists
  1946.     if(element)
  1947.     {
  1948.         var renderMode   = currentDocument.compatMode;
  1949.         var stringBundle = document.getElementById("webdeveloper-string-bundle");
  1950.         var textToolbar  = false;
  1951.  
  1952.         // If the toolbar preference has a value and is set to text
  1953.         if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
  1954.         {
  1955.             textToolbar = true;
  1956.         }
  1957.  
  1958.         // If the render mode is quirks mode
  1959.         if(renderMode == "BackCompat")
  1960.         {
  1961.             element.setAttribute("class", "quirks");
  1962.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_quirksModeTooltip"));
  1963.  
  1964.             // If the toolbar is in text mode
  1965.             if(textToolbar)
  1966.             {
  1967.                 element.setAttribute("label", stringBundle.getString("webdeveloper_quirksModeLabel"));
  1968.             }
  1969.         }
  1970.         else
  1971.         {
  1972.             // If the render mode button has a class attribute
  1973.             if(element.hasAttribute("class"))
  1974.             {
  1975.                 element.removeAttribute("class");
  1976.             }
  1977.  
  1978.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_standardsComplianceModeTooltip"));
  1979.  
  1980.             // If the toolbar is in text mode
  1981.             if(textToolbar)
  1982.             {
  1983.                 element.setAttribute("label", stringBundle.getString("webdeveloper_standardsComplianceModeLabel"));
  1984.             }
  1985.         }
  1986.     }
  1987. }
  1988.  
  1989. // Updates the status menu
  1990. function webdeveloper_updateStatusMenu(statusMenu)
  1991. {
  1992.     var appliedStylesLength = webdeveloper_appliedStyles.length;
  1993.  
  1994.     webdeveloper_removeGeneratedMenuItems(statusMenu);
  1995.  
  1996.     // Loop through the applied styles
  1997.     for(var i = 0; i < appliedStylesLength; i++)
  1998.     {
  1999.         webdeveloper_addStatusMenuItem(statusMenu,webdeveloper_appliedStyles[i]);
  2000.     }
  2001.  
  2002.     // If the status menu has only two children
  2003.     if(statusMenu.childNodes.length == 2)
  2004.     {
  2005.         return false;
  2006.     }
  2007.  
  2008.     return true;
  2009. }
  2010.  
  2011. // Error console listener
  2012. var WebDeveloperErrorConsoleListener =
  2013. {
  2014.     // Observes changes in the console
  2015.     observe: function(error)
  2016.     {
  2017.         // If the document and error are set
  2018.         if(document && error)
  2019.         {
  2020.             // Try to convert the error to a script error
  2021.             try
  2022.             {
  2023.                 error = error.QueryInterface(Components.interfaces.nsIScriptError);
  2024.  
  2025.                 var errorCategory = error.category;
  2026.                 var sourceName    = error.sourceName;
  2027.  
  2028.                 // If the error category is set and is content javascript
  2029.                 if(errorCategory && errorCategory == "content javascript")
  2030.                 {
  2031.                     webdeveloper_updateJavaScriptStatus(error);
  2032.                 }
  2033.                 else if(errorCategory && errorCategory == "CSS Parser")
  2034.                 {
  2035.                     webdeveloper_updateCSSStatus(error);
  2036.                 }
  2037.                 else if(sourceName && sourceName.indexOf("chrome://webdeveloper/") != -1 && webdeveloper_getBooleanPreference("webdeveloper.debug", true))
  2038.                 {
  2039.                     webdeveloper_openErrorConsole(false);
  2040.                 }
  2041.             }
  2042.             catch(exception)
  2043.             {
  2044.                 // Do nothing
  2045.             }
  2046.         }
  2047.  
  2048.         return false;
  2049.     }
  2050. }
  2051.